function gewGrassMaterial(effect,name)
{ 
  // general properties
  gewMaterial.call(this,effect,name);
  this.grassPackTexture = null;
  this.alphaRef = 0.3;
  this.strength = 20.;
  this.swingFactor = 0.3;
  //Private:
}
//gewGrassMaterial.prototype = new gewMaterial();
extend2(gewGrassMaterial,gewMaterial);
gewGrassMaterial.prototype.render = function()
{
  this.isRendering = true;
  // Render node list
  var effect = this.effect;
  var scene3d = effect.scene3d;
  var gl = this.gl;
  var game = effect.game;
  var grassPackTexture = this.grassPackTexture;
  if(grassPackTexture&&grassPackTexture.isReady)
  {    
    gl.uniform1f(effect.alphaRef, this.alphaRef);
    var wind = scene3d.wind;
    wind.divScalar(this.strength,gewRegVec0);
    gewRegVec0.mulScalar(this.swingFactor,gewRegVec1);
    var time = game.time / 1000.;
    gl.uniform4f(effect.vertexParam0,gewRegVec0.x,gewRegVec0.y,gewRegVec0.z,time);
    gl.uniform4f(effect.vertexParam1,gewRegVec1.x,gewRegVec1.y,gewRegVec1.z,0);
    
    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D, grassPackTexture.glName);
    var list  = this.nodeList;
    var listLen = list.length;
    for (var i = 0; i < listLen; i++) 
    {
      var node = list[i];
      if( node.isNeedPlantByHeightMap && node.heightMap.isReady)
        node.plantByHeightMap();
      if(!node.getFlag(NODE_FRUSTUM_IN)||!node.isVisible)
        continue;
      node.render(this);
    } 
  }
  this.isRendering = false;
}
